﻿#pragma once
#ifndef XL_XEXPAND_DWEBX_WOCONTEXT_H
//@隐藏{
#define XL_XEXPAND_DWEBX_WOCONTEXT_H

//@隐藏}
#include "module_WebOat.h"

//@分组{  封装类

//@别名 Wo上下文
class WEBOAT_MODIFICATION WoHTTPContext {
private:
	bool m_Next;
	int m_index;
	int m_max;
	std::vector<WoHttpControllerModel>* m_CallFunc;
	std::map<std::string, std::string> m_formMap;
	inja::json m_bodyMap;
private:

	//////@别名 请求体
	//WoHTTPIncomingRequestClass Request;
	////@别名 回复体
	//WoHTTPOutgoingResponseClass Response;
	WoHTTPIncomingRequestPtr Request;
	WoHTTPOutgoingResponsePtr Response;


public:

	//@隐藏{
	operator const WoHTTPOutgoingResponsePtr& () {
		return Response;
	}
	operator const WoHTTPIncomingRequestPtr& () {
		return Request;
	}
	WoHttpControllerModel& CallModel(int index);
	int Index(int index = -1);
	void Next(bool b);
	bool GetNext();
	int Max();
	WoHTTPContext(WoHTTPIncomingRequestPtr reqPtr, WoHTTPOutgoingResponsePtr respPtr);

	//@隐藏}

	//@参数 参数名 如:/user/{userId} ,则:"userId"
	//@别名 取参数(参数名)
	CXTextA GetParameter(const char* name) { return WoRequestGetPathVariable(Request, name); };
	//@参数 参数名 如:/user?userId=x ,则:"userId"
	//@别名 取查询(参数名)
	CXTextA GetQuery(const char* name) { return WoRequestGetQueryParameter(Request, name); };
	//@备注 仅支持 application/x-www-form-urlencoded
	//@别名 取PostForm(键名称)
	CXTextA GetPostForm(const char* key) {
		return WoRequestGetPostForm(this, key);
	}
	/*@声明
	//@备注 自动从 application/x-www-form-urlencoded 或者 application/json 数据流中获取数据并填充反射信息.
	// .注意:请勿传入指针
	//@别名 取Post数据_自动反射(接收变量)
	bool GetPostToBind(any& var);
	*/
	 //@隐藏{
	template<typename T>
	bool GetPostToBind(T& ptr){
		return WoRequestGetPostToBind(this, typeid(ptr).name(), (void*)&ptr);
	}
	 //@隐藏}


	//@别名 取路径()
	CXTextA GetPath() {
		return WoRequestGetPath(Request);
	}

	//@别名 下一个路由()
	void Next() {
		WoRequestHanderNext(Request);
	};
	//@备注 只是终止路由链继续传递,代码流需要自行return或者中断
	//@别名 终止路由()
	void Abort() {
		WoRequestHanderAbort(Request);
	};

	//@别名 回复体_添加头(键名,值)
	void ResponsePutHander(const char* key, const char* value) {
		WoResponsePutHeader(Response, key, value);
	};

	//@备注 向返回体写入字节集
	//@别名 回复体_写入字节集(字节集数据,长度)
	void ResponseAddByte(const char* data, UINT size) {
		WoResponseBodyAddBuffer(Response, data, size);
	};
	//@备注 向返回体写入字节集
	//@别名 回复体_置字节集(字节集数据,长度)
	void ResponseSetByte(const char* data, UINT size) {
		WoResponseBodySetBuffer(Response, data, size);
	};
	//@备注 向返回体写入文本
	//@别名 回复体_写入文本(文本数据)
	void ResponseAddTextA(const char* str) {
		WoResponseBodyAddTextA(Response, str);
	};
	//@备注 向返回体写入文本
	//@别名 回复体_置单文本(文本数据)
	void ResponseSetTextA(const char* str) {
		WoResponseBodySetTextA(Response, str);
	};
	//@别名 回复体_取大小()
	UINT ResponseSize() {
		return (UINT)WoResponseBodySize(Response);
	}
	//@别名 回复体_取数据(返回数据)
	void ResponseGetData(CXBytes&ret) {
		WoResponseGetData(Response,ret);
	}
	//@别名 回复JSON(数据集)
	void ResponseJSON(WoTemplateJson&json) {
		WoResponseSendJsonByTemplate(Response, json);
	}
	/*@声明
	//@备注 自动将结构体(结构体,或者动态数组),以json的形式返回
	//@别名 回复结构体(结构体)
	void ResponseModel(通用型&model);
	*/
	//@隐藏{
	template<typename T>
	void ResponseModel(T&model) {
		WoResponseSendJsonByModel(Response, typeid(model).name(),&model);
	}
	//@隐藏}
	//@备注 取当前准备传出的状态码
	//@别名 取状态码()
	int GetStatus() {
		return WoResponseGetStatus(Response);
	}

};

//@分组}

#endif

